categorical data with pandas
import pandas as pd
df=pd.DataFrame([['green','M',10.1,'class1'], ['red', 'L', 13.5, 'class2'], ['blue', 'XL', 15.3, 'class1']])
df.columns=['color', 'size', 'price', 'classlabel']
df
color size price classlabel
0 green M 10.1 class1
1 red L 13.5 class2
2 blue XL 15.3 class1
df는 순서가 없는 특성(color)와 순서가 있는 특성(size), 수치형 특성(price)가 있다.
순서가 있는 특성 매핑
XL=L+1=M+2 라고 size 특성을 올바르게 자동으로 바꾸어 주는 함수를 가정하자.
size_mapping={
'XL':3,
'L':2,
'M':1}
df['size']=df['size'].map(size_mapping)
df
color size price classlabel
0 green 1 10.1 class1
1 red 2 13.5 class2
2 blue 3 15.3 class1
판다스의 map 메서드를 이용하여 이와 동일하게 적용할 수 있다.
inv_size_mapping={v:k for k, v in size_mapping.items()}
df['size'].map(inv_size_mapping)
0 M
1 L
2 XL
Name: size, dtype: object
class label encoding
import numpy as np
class_mapping={label:idx for idx, label in enumerate(np.unique(df['classlabel']))}
class_mapping
{'class1': 0, 'class2': 1}
df['classlabel']=df['classlabel'].map(class_mapping)
df
color size price classlabel
0 green 1 10.1 0
1 red 2 13.5 1
2 blue 3 15.3 0
다시 되돌리기
inv_class_mapping={v:k for k, v in class_mapping.items()}
df['classlabel']=df['classlabel'].map(inv_class_mapping)
df
color size price classlabel
0 green 1 10.1 class1
1 red 2 13.5 class2
2 blue 3 15.3 class1
sklearn LabelEncoder
from sklearn.preprocessing import LabelEncoder
class_le=LabelEncoder()
y=class_le.fit_transform(df['classlabel'].values)
y
다시 되돌리기
class_le.inverse_transform(y)
array(['class1', 'class2', 'class1'], dtype=object)